<?php

// App::uses("String", "Utility");    
App::uses('GenericUtil', 'Lib');
App::uses('CakeEmail', 'Network/Email');

class UsersController extends AppController {

    // questa riga permette di utilizzare il componente Permission
    var $components = array('Permission'); 

    public function beforeFilter(){

		if(!$this->request->is('ajax'))
			parent::beforeFilter();
        $this->Auth->allow('login','logout','lostPassword','generaPassword');
    }

    //MA: non serve a nulla in quanto la lista visualizza solo in caso di utente ATTIVI. in tutti gli altri casi il controller
    // dovrò aprire pagine ad HOC
    
	public function beforeRender(){

	}
    
    public function index() {
		
    }

    public function password() {
    	$user = $this->Auth->user();
		$this->set("user",$user);
    }

    public function lostPassword() {
    
    }

    public function generaPassword() {
    	try {
			if (empty($this->request->data["username"]) && empty($this->request->data["email"])) {
				throw new Exception(__("Valorizzare la username o in alternativa la mail utilizzata per la registrazione."));
			} else {
				$userId=null;
				if (!empty($this->request->data["username"])) {
					$userId = $this->User->findByUsername($this->request->data["username"]);
				} else {
					$userId = $this->User->findByEmail($this->request->data["email"]);
				}
				if($userId==null)
					throw new Exception(__("Username o email non trovate"));
				$key = GenericUtil::generate_key();
				$this->User->set("id",$userId["User"]["id"]);
				$this->User->set("password", $this->Auth->password($key));
			}
			$this->User->save();
			$this->invioEmailGenerazionePassword($key);
			$this->Session->setFlash(__("<b>Password resettata</b><br>Riceverai una mail con la nuova password generata dal sistema."));
			$this->redirect("/Home");
		} catch (exception $e) {
			CakeLog::error($e->getMessage());
			$this->Session->setFlash($e->getMessage(),"default",null,"error");
			$this->redirect($this->referer());
		}

    }

	private function validateModel() {
		if(!$this->User->validates()) {
			throw new Exception(serialize($this->User->validationErrors));
		}
	}


    public function changePassword() {
    	try {
			if (!empty($this->request->data["password"]) && $this->request->data["password"]==$this->request->data["verifica_password"]) {
				$this->User->set("password", $this->Auth->password($this->request->data["password"]));
				$this->validateModel();
				$this->User->save($this->request->data);
				$this->Session->setFlash(__("Password aggiornata correttamente."));
				$this->redirect($this->Auth->loginRedirect);
			} else {
				$this->Session->setFlash(__("Le password inserite non coincidono."),"default",null,"error");
				$this->redirect($this->referer());
			}
		} catch (exception $e) {
			CakeLog::error($e->getMessage());
			$this->Session->setFlash($e->getMessage(),"default",null,"error");
		}
    }

	private function invioEmailGenerazionePassword($pwd) {
		$this->email = new CakeEmail("minijob");
		$this->email->to($this->User->field("email"));
		$msg = __("Ciao %s,<br> la tua nuova password è la seguente:<br><br><span style='font-family:Lato'  class='label copyable'> %s </span>",$this->User->field("username"),$pwd);
		$base_url = Router::url("/",true);
		$this->email->subject(APP_DESCR." - ".__("generazione password"));
        $this->email->viewVars(array( 'msg' => base64_encode($msg),'base_url'=>$base_url));
        $this->email->template('default', 'default');
        $this->email->emailFormat('html');
		
		if (!$this->email->send($msg) ) {
		    CakeLog::error($e->getMessage());
			throw new Exception(__("Errore in fase di invio della mail di attivazione."));
        }
	}
	
	function login($username=null) {
		try {
			if (!empty($username))
				$this->set("username",$username);
			// se sono già loggato reindirizzo al logout
			if ($this->Auth->loggedIn())
				$this->redirect("/Users/logout");
			
		    if ($this->request->is('post')) {
		    	// login classico inviato dalla submit del modulo di login
		        if ($this->Auth->login()) {
					// pr($this->Auth->user());die;
		            // return $this->redirect($this->Auth->redirect()); // disabilitare se si vuole utilizzare il redirecr impostato su Auth
					// una volta effettuato il login inserisco in sessione le autorizzazioni ACL legate all'utente connesso.
					$this->Permission->setPermissionToSession();
					// pr($utente);die;
					//salvo la data di accesso
					$this->User->id = $this->Auth->user("id");
	                $this->User->saveField("dt_accesso", date("Y-m-d H:i:s"));
					CakeLog::write(LOG_INFO, __("%s ha eseguito l'accesso.", $this->Auth->user("username")));
					$this->redirect($this->Auth->loginRedirect);
		        } else {
					$this->set("shake",true);
					throw new Exception(__("Utente non attivo o username e password non corretti."));
		        }
			}
		} catch (Exception $e) {
			CakeLog::write(LOG_ERR, $e->getMessage());
	        $this->Session->setFlash($e->getMessage(), "default",null, "error");
            // $this->redirect($this->referer());
		}
	}


	function logout() {
		CakeLog::write(LOG_INFO, __("%s ha eseguito il logout.", $this->Auth->user("username")));
		// nal caso mi sono loggato tramite facebook, reindirizzo alla pagina di logout di facebbok che richiamarà in seguito questo metodo facendo il logout su minijob
		$this->Auth->logout();
		// eliminare dalla sessione le autorizzaizoni ACL legate all'utente.
		$this->Permission->clearPermissionfromSession();
		// se si è autorizzati a stare su questa pagine ok
		$this->Session->destroy();
	    $this->redirect($this->Auth->logoutRedirect);
		// $this->redirect($this->referer());
	}
	

}
?>